package zuosheng.day4;

import java.util.Stack;

/**
 * @author lj
 * @Description: 实现一个特殊的栈，在实现栈的基本功能的基础上，再实现返 回栈中最小元素的操作。
 * @date 2020-11-03 15:05
 * @QQ 851477108
 */


public class GetMinStack{
    public static void main(String[] args) {
        MyStack2 stack2 = new MyStack2();
        stack2.push(3);
        System.out.println(stack2.getMin());
        stack2.push(4);
        System.out.println(stack2.getMin());
        stack2.push(1);
        System.out.println(stack2.getMin());
        System.out.println(stack2.pop());
        System.out.println(stack2.getMin());
    }

    public static class MyStack2 {

        private Stack<Integer> stackData = new Stack<>();
        //用一个栈存放动态的最小值
        private Stack<Integer> stackMin = new Stack<>();
        //无参构造函数
        public MyStack2(){
        }
        //入栈
        public void push(int n){
            //将n全部压入Data栈中
            stackData.push(n);
            
            if (stackMin.isEmpty()){
                //栈为空，那么第一个数直接进min栈
                stackMin.push(n);
            }else if (n < getMin()){
                //栈不为空，入min栈的时候，先与min栈的栈顶数据进行比较，小的数入min栈
                stackMin.push(n);
            }else {
                int newMin = stackMin.peek();
                stackMin.push(newMin);
            }
        }
        //弹栈
        public int pop(){
            if (stackData.isEmpty()) {
                throw new RuntimeException("Your stack is empty.");
            }
            //弹栈的时候，data栈和min栈一起弹出，如果栈为空，则先提醒用户
            stackMin.pop();
            return stackData.pop();
        }
        //取最小值
        public int getMin(){
            if (stackMin.isEmpty()){
                throw new RuntimeException("Your stack is empty.");
            }
            //直接获取最小栈的数据即可，如果栈为空，则先提醒用户
            return stackMin.peek();
        }
    }

}